home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / YANNS3D.ZIP / STUFF / FPMATH.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-08-21  |  5.5 KB  |  315 lines

  1.     .MODEL SMALL
  2.     .CODE
  3.  
  4.  
  5.     PUBLIC _FixedMul
  6. FMparms STRUC
  7.     DW      2 DUP(?)
  8. M1low   DW      ?
  9. M1hi    DW      ?
  10. M2low   DW      ?
  11. M2hi    DW      ?
  12. FMparms ENDS
  13.     ALIGN   2
  14. _FixedMul       PROC
  15.     push    bp
  16.     mov     bp,sp
  17.     sub     sp,2            ; word ptr [bp-2] = SignFlag
  18.     mov     WORD PTR [bp-2],0
  19.     mov     ax,[bp].M1low
  20.     mov     bx,[bp].M1hi
  21.     or      bx,bx
  22.     jns     FMpositivo1
  23.     not     bx
  24.     not     ax
  25.     inc     ax
  26.     adc     bx,0
  27.     mov     [bp].M1low,ax
  28.     mov     [bp].M1hi,bx
  29.     xor     WORD PTR [bp-2],1
  30. FMpositivo1:
  31.     mov     ax,[bp].M2low
  32.     mov     bx,[bp].M2hi
  33.     or      bx,bx
  34.     jns     FMpositivo2
  35.     not     bx
  36.     not     ax
  37.     inc     ax
  38.     adc     bx,0
  39.     mov     [bp].M2low,ax
  40.     mov     [bp].M2hi,bx
  41.     xor     WORD PTR [bp-2],1
  42. FMpositivo2:
  43.     mov     ax,[bp].M1low
  44.     mov     bx,[bp].M2hi
  45.     mul     bx
  46.     mov     cx,ax
  47.     mov     si,dx
  48.     mov     ax,[bp].M1hi
  49.     mov     bx,[bp].M2low
  50.     mul     bx
  51.     add     cx,ax
  52.     adc     si,dx
  53.     mov     ax,[bp].M1hi
  54.     mov     bx,[bp].M2hi
  55.     mul     bx
  56.     add     si,ax
  57.     mov     ax,[bp].M1low
  58.     mov     bx,[bp].M2low
  59.     mul     bx
  60.     shl     ax,1
  61.     adc     cx,dx
  62.     adc     si,0
  63.     mov     dx,si
  64.     mov     ax,cx
  65.     mov     cx,[bp-2]
  66.     or      cx,cx
  67.     jz      FMpositivoRes
  68.     not ax
  69.     not dx
  70.     inc ax
  71.     adc dx,0
  72. FMpositivoRes:
  73.     mov     sp,bp
  74.     pop     bp
  75.     ret
  76. _FixedMul       ENDP
  77.  
  78.  
  79.     PUBLIC  _FixedDiv
  80. FDparms STRUC
  81.     dw      2 dup(?)
  82. Dlow    dw      ?
  83. Dhi     dw      ?
  84. dlow    dw      ?
  85. dhi     dw      ?
  86. FDparms ENDS
  87.     ALIGN   2
  88. _FixedDiv       PROC
  89.     push    bp
  90.     mov     bp,sp
  91.     sub     sp,2    ;[bp-2]=sign
  92.     push    si
  93.     push    di
  94.     mov     WORD PTR [bp-2],0
  95.     mov     ax,[bp].Dlow
  96.     mov     bx,[bp].Dhi
  97.     or      bx,bx
  98.     jns     FDpositivo1
  99.     not     bx
  100.     not     ax
  101.     inc     ax
  102.     adc     bx,0
  103.     mov     [bp].Dlow,ax
  104.     mov     [bp].Dhi,bx
  105.     xor     WORD PTR [bp-2],1
  106. FDpositivo1:
  107.     mov     ax,[bp].dlow
  108.     mov     bx,[bp].dhi
  109.     or      bx,bx
  110.     jns     FDpositivo2
  111.     not     bx
  112.     not     ax
  113.     inc     ax
  114.     adc     bx,0
  115.     mov     [bp].dlow,ax
  116.     mov     [bp].dhi,bx
  117.     xor     WORD PTR [bp-2],1
  118. FDpositivo2:
  119.     mov     ax,[bp].Dhi
  120.     or      ax,ax
  121.     jnz     Not1632
  122.     mov     ax,[bp].dhi
  123.     push    ax
  124.     mov     ax,[bp].dlow
  125.     push    ax
  126.     mov     ax,[bp].Dlow
  127.     push    ax
  128.     xor     ax,ax
  129.     push    ax
  130.     call    LongPosDiv
  131.     add     sp,8
  132.     jmp     DivDone
  133. Not1632:
  134.     mov     ax,[bp].dlow
  135.     or      ax,ax
  136.     jnz     Not3216
  137.     mov     cx,[bp].dhi
  138.     mov     ax,[bp].Dhi
  139.     xor     dx,dx
  140.     div     cx
  141.     mov     bx,ax
  142.     mov     ax,[bp].Dlow
  143.     div     cx
  144.     mov     dx,bx
  145.     jmp     DivDone
  146. Not3216:
  147.     mov     ax,[bp].dhi
  148.     or      ax,ax
  149.     jnz     Not4816
  150.     mov     dx,[bp].Dhi
  151.     mov     ax,[bp].Dlow
  152.     mov     bx,[bp].dlow
  153.     div     bx
  154.     mov     cx,ax           ;HiResultado
  155.     xor     ax,ax
  156.     div     bx
  157.     mov     dx,cx           ;HiResultado
  158.     jmp     DivDone
  159. Not4816:
  160.     mov     dx,[bp].Dhi
  161.     mov     ax,[bp].Dlow
  162.     xor     di,di
  163.     mov     bx,[bp].dhi
  164.     mov     cx,[bp].dlow
  165. ShiftAgain:
  166.     shr     bx,1            ;32hi16
  167.     rcr     cx,1            ;32lo16
  168.     shr     dx,1            ;48hi16
  169.     rcr     ax,1            ;48mid16
  170.     rcr     di,1            ;48lo16
  171.     or      bx,bx
  172.     jnz     ShiftAgain
  173.     div     cx
  174.     mov     si,ax           ;HiRes
  175.     mov     ax,di           ;48lo16
  176.     div     cx
  177.                 ;ahora tenemos: si·ax=aprox. del resultado
  178.     push    si
  179.     push    ax
  180.     xor     di,di
  181.     push    ax
  182.     mul     WORD PTR [bp].dlow
  183.     mov     cx,dx
  184.     mov     di,ax
  185.     pop     ax
  186.     mul     WORD PTR [bp].dhi
  187.     add     cx,ax
  188.     add     bx,dx
  189.     mov     ax,si
  190.     mul     WORD PTR [bp].dlow
  191.     add     cx,ax
  192.     add     bx,dx
  193.     mov     ax,si
  194.     mul     WORD PTR [bp].dhi
  195.     add     bx,ax
  196.     pop     ax
  197.     pop     si
  198.     cmp     bx,[bp].Dhi
  199.     ja      DecreaseAprox
  200.     jb      DontDecreaseAprox
  201.     cmp     cx,[bp].Dlow
  202.     ja      DecreaseAprox
  203.     jb      DontDecreaseAprox
  204.     or      di,di
  205.     jz      DontDecreaseAprox
  206. DecreaseAprox:
  207.     sub     ax,1
  208.     sbb     si,0
  209. DontDecreaseAprox:
  210.     mov     dx,si
  211. DivDone:
  212.     mov     cx,[bp-2]
  213.     or      cx,cx
  214.     jz      FDpositivoRes
  215.     not ax
  216.     not dx
  217.     inc ax
  218.     adc dx,0
  219. FDpositivoRes:
  220.     pop     di
  221.     pop     si
  222.     mov     sp,bp
  223.     pop     bp
  224.     ret
  225. _FixedDiv       ENDP
  226.  
  227. LongPosDiv      PROC
  228.     push    bp
  229.     mov     bp,sp
  230.     push    si
  231.     push    bx
  232.     mov     ax,[bp+10]
  233.     or      ax,ax
  234.     jnz     LPDiv3232
  235.     mov     cx,[bp+8]
  236.     mov     ax,[bp+6]
  237.     xor     dx,dx
  238.     div     cx
  239.     mov     bx,ax
  240.     mov     ax,[bp+4]
  241.     div     cx
  242.     mov     dx,bx
  243.     jmp     LPDivDone
  244. LPDiv3232:
  245.     mov     bx,ax
  246.     mov     cx,[bp+8]
  247.     mov     dx,[bp+6]
  248.     mov     ax,[bp+4]
  249. LPShiftAgain:
  250.     shr     bx,1
  251.     rcr     cx,1
  252.     shr     dx,1
  253.     rcr     ax,1
  254.     or      bx,bx
  255.     jnz     LPShiftAgain
  256.     div     cx
  257.     mov     si,ax
  258.     mul     WORD PTR [bp+10]
  259.     xchg    ax,cx
  260.     mov     ax,[bp+8]
  261.     mul     si
  262.     add     dx,cx
  263.     jc      LPDecreaseAprox
  264.     cmp     dx,[bp+6]
  265.     ja      LPDecreaseAprox
  266.     jb      LPDontDecreaseAprox
  267.     cmp     ax,[bp+4]
  268.     jbe     LPDontDecreaseAprox
  269. LPDecreaseAprox:
  270.     dec     si
  271. LPDontDecreaseAprox:
  272.     xor     dx,dx
  273.     xchg    ax,si
  274. LPDivDone:
  275.     pop     bx
  276.     pop     si
  277.     mov     sp,bp
  278.     pop     bp
  279.     ret
  280. LongPosDiv      ENDP
  281.  
  282.  
  283.     PUBLIC _FixedTrunc
  284. FTparms STRUC
  285.     DW      2 dup(?)
  286. FTarglow DW     ?
  287. FTarghi DW      ?
  288. FTparms ENDS
  289.     ALIGN 2
  290. _FixedTrunc     PROC
  291.     push    bp
  292.     mov     bp,sp
  293.     mov     dx,[bp].FTarghi
  294.     xor     ax,ax
  295.     pop     bp
  296.     ret
  297. _FixedTrunc     ENDP
  298.  
  299.     PUBLIC _FixedFractional
  300. FFparms STRUC
  301.     DW      2 dup(?)
  302. FFarglow DW     ?
  303. FFarghi DW      ?
  304. FFparms ENDS
  305.     ALIGN 2
  306. _FixedFractional PROC
  307.     push    bp
  308.     mov     bp,sp
  309.     mov     ax,[bp].FTarglow
  310.     xor     dx,dx
  311.     pop     bp
  312.     ret
  313. _FixedFractional ENDP
  314.  
  315.     END